<template>
    <div>
        <h3>- Set 类似于数组，但是成员的值都是唯一的，没有重复的值</h3>
        <p>Set 结构不会添加重复的值；在 Set 内部，两个NaN是相等，而两个对象总是不相等的所以它们被视为两个值</p>
        <code>[...new Set(array)] 或 Array.from(new Set(array)) //去除数组的重复成员；[...new Set('ababbc')].join('') //去除字符串里面的重复字符</code>
        <ul>
            属性：
            <li>Set.prototype.constructor：构造函数，默认就是Set函数</li>
            <li>Set.prototype.size：返回Set实例的成员总数</li>
            操作方法：
            <li>Set.prototype.add(value)：添加某个值，返回 Set 结构本身</li>
            <li>Set.prototype.delete(value)：删除某个值，返回一个布尔值，表示删除是否成功</li>
            <li>Set.prototype.has(value)：返回一个布尔值，表示该值是否为Set的成员</li>
            <li>Set.prototype.clear()：清除所有成员，没有返回值</li>
            遍历方法：
            <li>Set.prototype.keys()：返回键名的遍历器</li>
            <li>Set.prototype.values()：返回键值的遍历器</li>
            <li>Set.prototype.entries()：返回键值对的遍历器</li>
            <li>Set.prototype.forEach()：使用回调函数遍历每个成员 与数组一样</li>
        </ul>
        <p>Set的遍历顺序就是插入顺序；Set 结构没有键名，只有键值（或者说键名和键值是同一个值）所以keys方法和values方法的行为完全一致 entries方法返回的遍历器，同时包括键名和键值，所以每次输出一个数组，它的两个成员完全相等</p>
        <code>可以直接用for...of循环遍历 Set：let set = new Set(['red', 'green', 'blue']); for (let x of set) {} //red //green //blue</code>
        <h3>- WeakSet 与Set一样没有重复值</h3>
        <p>区别：1、WeakSet 的成员只能是对象，而不能是其他类型的值 2、WeakSet 中的对象都是弱引用，垃圾回收机制不考虑 WeakSet 对该对象的引用，如果其他对象不再引入该对象 则不管WeakSet对该对象是否还在引用 其内存都会被回收 3、WeakSet 不可遍历</p>
        <code>WeakSet 可以接受任何具有 Iterable 接口的对象（数组、类似数组）作为参数：const a = [[1, 2], [3, 4]];const ws = new WeakSet(a);// WeakSet {[1, 2], [3, 4]} <b>!!注意，是a数组的成员成为 WeakSet 的成员，而不是a数组本身。这意味着，数组的成员只能是对象。</b></code>
        <ul>
            三个方法：
            <li>WeakSet.prototype.add(value)：向 WeakSet 实例添加一个新成员</li>
            <li>WeakSet.prototype.delete(value)：清除 WeakSet 实例的指定成员</li>
            <li>WeakSet.prototype.has(value)：返回一个布尔值，表示某个值是否在 WeakSet 实例之中</li>
        </ul>
        <h3>- Map 类似于对象，也是键值对的集合，但是“键”的范围不限于字符串 提供了“值—值”的对应</h3>
        <p>任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以当作Map构造函数的参数，包括Set 和 Map</p>
        <p>对同一个键赋值两次，后一次的值覆盖前一次的值，如果读取一个未知的键，则返回undefined</p>
        <p><b>!!Map 的键实际上是跟内存地址绑定的，只要内存地址不一样，就视为两个键</b>所以：<code>const map = new Map(); map.set(['a'], 555); map.get(['a']) // undefined</code>数组对象的内存地址是不一样的</p>
        <p>如果 Map 的键是一个简单类型的值（数字、字符串、布尔值），则只要两个值严格相等，Map 将其视为一个键，比如0和-0就是一个键，布尔值true和字符串true则是两个不同的键。另外，undefined和null也是两个不同的键。虽然NaN不严格相等于自身，但 Map 将其视为同一个键。</p>
        <ul>
            属性：
            <li>size属性返回 Map 结构的成员总数。</li>
            操作方法：
            <li>Map.prototype.set(key, value)：设置键名key对应的键值为value，然后返回整个 Map 结构，可采用链式写法</li>
            <li>Map.prototype.get(key)：读取key对应的键值，如果找不到key，返回undefined</li>
            <li>Map.prototype.has(key)：某个键是否在当前 Map 对象之中</li>
            <li>Map.prototype.delete(key)：删除某个键，返回true。如果删除失败，返回false</li>
            <li>Map.prototype.clear()：清除所有成员，没有返回值</li>
            遍历方法：Map 的遍历顺序就是插入顺序。
            <li>Map.prototype.keys()：返回键名的遍历器。</li>
            <li>Map.prototype.values()：返回键值的遍历器。</li>
            <li>Map.prototype.entries()：返回所有成员的遍历器。</li>
            <li>Map.prototype.forEach()：遍历 Map 的所有成员。</li>
        </ul>
        <h3>- WeakMap 与Map结构类似，也是用于生成键值对的集合</h3>
        <p>区别：1、WeakMap只接受对象作为键名（null除外），不接受其他类型的值作为键名 2、<b>!!键名(键值仍然是正常引用！受垃圾回收机制影响)</b>所引用的对象都是弱引用，垃圾回收机制不考虑 WeakMap 对该对象的引用，如果其他对象不再引入该对象 则不管WeakMap对该对象是否还在引用 其内存都会被回收 3、不可遍历</p>
        <p><b>四个方法：</b>get()、set()、has()、delete()</p>
    </div>
</template>

<script>
export default {
    
}
</script>

<style scoped>

</style>